import {login, logout, getInfo} from '@/api/user'
import {getToken, setToken, removeToken} from '@/utils/auth'
import router, {resetRouter} from '@/router'

const state = {
  token: getToken(),
  name: '',
  avatar: '',
  introduction: '',
  roles: [],
  id: '',
  qq: '',
  tgroup: '',
  phone: '',
  grade: '',
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ID: (state, id) => {
    state.id = id
  },
  SET_TGROUP: (state, tgroup) => {
    state.tgroup = tgroup
  },
  SET_QQ: (state, qq) => {
    state.qq = qq
  },
  SET_PHONE: (state, phone) => {
    state.phone = phone
  },
  SET_GRADE: (state, grade) => {
    state.grade = grade
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  }
}

const actions = {
  // user login
  login({commit}, userInfo) {
    const {type, username, password, captcha, uuid, phoneCaptcha} = userInfo
    return new Promise((resolve, reject) => {
      login({
        type,
        username: username.trim(),
        password: password,
        captcha,
        uuid,
        phoneCaptcha
      }).then(response => {
        console.log(response)
        const {data} = response
        commit('SET_TOKEN', data.token)
        setToken(data.token)
        resolve()
      }).catch(error => reject(error))
    })
  },

  // get user info
  getInfo({commit, state}) {
    return new Promise((resolve, reject) => {

      getInfo().then(response => {
        let data = response.data
        data.roles = ['admin']

        commit('SET_ROLES', data.roles)
        commit('SET_NAME', data.name)
        commit('SET_AVATAR', data.avator || '#')
        commit('SET_INTRODUCTION', data.introduction)
        commit('SET_CLASS', data.clas)
        commit('SET_ID', data.id)
        commit('SET_QQ', data.qq)
        commit('SET_PHONE', data.phone)
        commit('SET_TGROUP', data.tgroup)
        commit('SET_GRADE', data.grade)

        console.log(data)
        resolve(data)
      }).catch(error => reject(error))
    })
  },

  // user logout
  logout({commit, state, dispatch}) {
    return new Promise((resolve, reject) => {
      // logout(state.token).then(() => {
      //   commit('SET_TOKEN', '')
      //   commit('SET_ROLES', [])
      //   removeToken()
      //   resetRouter()
      //
      //   // reset visited views and cached views
      //   // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
      //   dispatch('tagsView/delAllViews', null, { root: true })
      //
      //   resolve()
      // }).catch(error => {
      //   reject(error)
      // })
      removeToken()
      resetRouter()
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      resolve()
    })
  },

  // remove token
  resetToken({commit}) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      removeToken()
      resolve()
    })
  },

  // dynamically modify permissions
  async changeRoles({commit, dispatch}, role) {
    const token = role + '-token'

    commit('SET_TOKEN', token)
    setToken(token)

    const {roles} = await dispatch('getInfo')

    resetRouter()

    // generate accessible routes map based on roles
    const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true})
    // dynamically add accessible routes
    router.addRoutes(accessRoutes)

    // reset visited views and cached views
    dispatch('tagsView/delAllViews', null, {root: true})
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
